По своей идее OpenGL является базовым уровнем. Как и вокруг любого API вокруг неё существует большое количество различных оболочек для упрощения жизни, начиная от самых простых, типа GLU и заканчивая объектной надстройкой Open Invertor (SGI), которая к сожалению не является свободно распространяемой. Библиотека GLU входит в стандартную поставку OpenGL и потому ей грех не воспользоваться.
Библиотека имеет целый ряд интересных функций, но на мой взгляд наиболее привлекательное свойство - quadric объекты. Резонный вопрос - что это такое? Ответ прост как и сами объекты - это геометрические фигуры 2-го порядка, т.е. сфера, цилиндр, диск, конус. Рассмотрим пример создания и использования quadric объекта на сфере, остальные примитивы вы сможете попробовать сами.
Итак, классика, создаем проект. Выбросили оттуда все старые вставки. Добавили в stdafx.h
#include <GL/glu.h> //(если вы еще не сделали этого раньше)
Теперь объявляем переменную класса C...View:
private: GLUquadricObj* m_qObj;
Переходим в конструктор класса и инициализируем её:
CExampleView::CExampleView()
{
// TODO: add construction code here
m_qObj = gluNewQuadric();
}
Функция gluNewQuadric создает новый объект нужного нам типа (в реальности просто создается указатель на пустую структуру).
Теперь мы можем воспользовать этим указателем и создать нужный нам объект:
void CExampleView::OnDraw(CDC* pDC)
{
CExampleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glColor3f(0.0f, 0.5f, 0.5f);
gluSphere(m_qObj, 1.0f, 10, 10);
SwapBuffers(pDC->m_hDC);
}
Функция gluSphere принимает 4 аргумента, 1-й - это указатель на Quadric объект, 2-й - радиус сферы, 3-й и 4-й - количество узлов, из которых будет строится сфера вокруг оси Z и вдоль оси Z соответственно.
Должно быть не совсем понятно, но попробуйте просто поменять число 10 на 100 и почувствуйте разницу.
Ну и последнее, все Quadric объекты должны быть удалены после работы.
CExampleView::~CExampleView()
{
gluDeleteQuadric(m_qObj);
}
Здесь есть одна хитрость. При желании вы можете поставить команду удаления объекта до его использования и при этом все будет работать!!! Этого делать не рекомендуется, т.к. при этом все равно объект отрисуется неправильно. Как выглядит эта "неправильность" - посмотрите сами.
Так же можно попробовать использовать один объект для создания сферы, цилиндра и еще чего-нибудь... но при этом я не гарантирую, что у вас не будет теряться память. Ведь объект представляет собой набор вершин. Что будет если свера имела 1000 узлов, а цилиндр 100? После "перехода" объекта от сферы к цилиндру возможна потеря памяти, необходимой для хранения как минимум 900 вершин. Возможно, что она и не будет теряться, если функция создания новой фигуры проверяет занятость объекта, корректно все удаляет, а потом создает новую фигуру.
К сожалению документация по GLU умалчивает об этом. Поэтому надежнее всего будет создавать объекты для каждой фигуры и удалять их тогда, когда они уже не нужны.